Antecedentes

Walmart

Objetivo

En el presente proyecto, se realizó un modelo para categorizar las visitas que realizan los clientes a Walmart basándose únicamente en los productos que compran los clientes en su visita. La base se obtuvo de kaggle de la competencia titulada “Walmart Recruiting: Trip Type Classification”.

Las categorías están representadas por números enteros no contiguos, y no se conoce el significado de ninguna categoría.

La función que se busca optimizar, más específicamente minimizar, es la pérdida logarítmica multiclase también conocida como log loss multiclase, misma que se define como:

\(-\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{M}y_{ij}log(p_{ij})\)

donde \(N\) es el total de visitas en el conjunto de prueba, \(M\) es el total de categorías existentes (como más adelante se verá \(M = 38\)), \(y_{ij}\) es 1 si la observación \(i\) pertenece a la categoría \(j\) y 0 en otro caso, \(p_{ij}\) es la probabilidad obtenida por el modelo que la observación \(i\) pertenezca a la categoría \(j\).

Criterio de Éxito

Obtener un valor de la función log loss menor a 1 sobre el conjunto de prueba.

Lectura y limpieza de datos

Se realiza la lectura y limpieza de datos con las funciones utils, load, prepare y clean:

source("utils.R")
source("00-load.R")
## [1] "walmart.rds se bajó y guardó\n"
source("01-prepare.R")
source("02-clean.R")

La base de datos original muestra un registro por cada producto que se compró en las diferentes visitas de los clientes en la tienda. Por ejemplo, si un cliente en su visita compró 10 productos diferentes, esa visita tiene 10 registros con el mismo identificador de visita y mismo tipo de visita. Los primeros renglones de la base son los siguientes:

##   TripType VisitNumber Weekday         Upc ScanCount DepartmentDescription
## 1      999           5  Friday 68113152929        -1    FINANCIAL SERVICES
## 2       30           7  Friday 60538815980         1                 SHOES
## 3       30           7  Friday  7410811099         1         PERSONAL CARE
## 4       26           8  Friday  2238403510         2 PAINT AND ACCESSORIES
## 5       26           8  Friday  2006613744         2 PAINT AND ACCESSORIES
## 6       26           8  Friday  2006618783         2 PAINT AND ACCESSORIES
##   FinelineNumber
## 1           1000
## 2           8931
## 3           4504
## 4           3565
## 5           1017
## 6           1017

Las variables con las que se cuenta en la base de datos son:

  • TripType - es una variable categórica que indica el tipo de visita que realizó una persona en Walmart, es la variable objetivo que se busca predecir
  • VisitNumber - es el identificador único para cada visita que realizaron los diferentes clientes a Walmart
  • Weekday - día de la semana en que el cliente realizó la visita a Walmart
  • Upc - es un código para identificar de forma única los productos de Walmart
  • ScanCount - número de productos de un tipo específico que se compararon, si el valor es -1 indica una devolución de producto
  • DepartmentDescription - departamente al cual pertenece el producto
  • FinelineNumber - código para identificar los productos de una forma más general que el código Upc pero más granular que el departamento

La estructura original de la base no tiene registros únicos a nivel visita, esto complica el ajuste del modelo pues las categorías son a nivel visita. Si se trabajara con la base original, se estaría ajustando una categoría a nivel producto en lugar de a nivel visita. Por lo tanto, el tratamiento que se realizó a los datos consistió en construir la base de forma que tenga un solo renglón por visita. La variable de día de la semana es a nivel visita, por lo que no sufrió modificaciones. Respecto a las variables del departamento y número de productos, se crearon tantas columnas como departamentos existen, 68 en total, y se sumaron de acuerdo al número de productos por departamento comprados por visita. La base creada y utilizada para modelar luce como sigue:

## # A tibble: 10 x 71
## # Groups:   TripType, VisitNumber, Weekday [10]
##    TripType VisitNumber Weekday HR_PHOTO ACCESSORIES AUTOMOTIVE BAKERY
##       <int>       <int> <chr>      <dbl>       <dbl>      <dbl>  <dbl>
##  1        3         106 Friday         0           0          0      0
##  2        3         121 Friday         0           0          0      0
##  3        3         153 Friday         0           0          0      0
##  4        3         162 Friday         0           0          0      0
##  5        3         164 Friday         0           0          0      0
##  6        3         177 Friday         0           0          0      0
##  7        3         181 Friday         0           0          0      0
##  8        3         188 Friday         0           0          0      0
##  9        3         203 Friday         0           0          0      0
## 10        3         265 Friday         0           0          0      0
## # ... with 64 more variables: BATH_AND_SHOWER <dbl>, BEAUTY <dbl>,
## #   BEDDING <dbl>, BOOKS_AND_MAGAZINES <dbl>, BOYS_WEAR <dbl>,
## #   BRAS__SHAPEWEAR <dbl>, CAMERAS_AND_SUPPLIES <dbl>,
## #   CANDY_TOBACCO_COOKIES <dbl>, CELEBRATION <dbl>, COMM_BREAD <dbl>,
## #   CONCEPT_STORES <dbl>, COOK_AND_DINE <dbl>, DAIRY <dbl>,
## #   DSD_GROCERY <dbl>, ELECTRONICS <dbl>, FABRICS_AND_CRAFTS <dbl>,
## #   FINANCIAL_SERVICES <dbl>, FROZEN_FOODS <dbl>, FURNITURE <dbl>,
## #   GIRLS_WEAR_46X__AND_74 <dbl>, GROCERY_DRY_GOODS <dbl>, HARDWARE <dbl>,
## #   HEALTH_AND_BEAUTY_AIDS <dbl>, HOME_DECOR <dbl>, HOME_MANAGEMENT <dbl>,
## #   HORTICULTURE_AND_ACCESS <dbl>, HOUSEHOLD_CHEMICALS_SUPP <dbl>,
## #   HOUSEHOLD_PAPER_GOODS <dbl>, IMPULSE_MERCHANDISE <dbl>,
## #   INFANT_APPAREL <dbl>, INFANT_CONSUMABLE_HARDLINES <dbl>,
## #   JEWELRY_AND_SUNGLASSES <dbl>, LADIES_SOCKS <dbl>, LADIESWEAR <dbl>,
## #   LARGE_HOUSEHOLD_GOODS <dbl>, LAWN_AND_GARDEN <dbl>,
## #   LIQUORWINEBEER <dbl>, MEAT__FRESH__FROZEN <dbl>,
## #   MEDIA_AND_GAMING <dbl>, MENSWEAR <dbl>, `NULL` <dbl>,
## #   OFFICE_SUPPLIES <dbl>, OPTICAL__FRAMES <dbl>, OPTICAL__LENSES <dbl>,
## #   OTHER_DEPARTMENTS <dbl>, PAINT_AND_ACCESSORIES <dbl>,
## #   PERSONAL_CARE <dbl>, PETS_AND_SUPPLIES <dbl>, PHARMACY_OTC <dbl>,
## #   PHARMACY_RX <dbl>, PLAYERS_AND_ELECTRONICS <dbl>,
## #   PLUS_AND_MATERNITY <dbl>, PRE_PACKED_DELI <dbl>, PRODUCE <dbl>,
## #   SEAFOOD <dbl>, SEASONAL <dbl>, SERVICE_DELI <dbl>,
## #   SHEER_HOSIERY <dbl>, SHOES <dbl>, SLEEPWEAR_FOUNDATIONS <dbl>,
## #   SPORTING_GOODS <dbl>, SWIMWEAR_OUTERWEAR <dbl>, TOYS <dbl>,
## #   WIRELESS <dbl>

En cuanto a la limpieza, ésta consistió en unificar dos departamentos MENS WEAR con MENSWEAR; para todas las variables de departamento se cambiaron los NA’s por 0, pues en realidad los valores nulos de esas variables son porque se realizaron cero compras de ese departamento en la respectiva visita. En los nombres de las variables, se sustituyeron los espacios por guiones bajos y se eliminaron caracteres especiales (las comas y los &) para facilitar en manejo de la base en el análisis exploratorio.

De esta manera, se obtiene una base de datos con 95’674 registros (únicos a nivel visita) y 69 variables explicativas.

Análisis Exploratorio

En primer lugar, se analiza la variable objetivo: el tipo de visita realizada en Walmart. Su distribución luce como se muestra en la siguiente gráfica:

Se observa que existen categorías que sobresalen respecto a las demás, estas categorías son: 8, 9, 39, 40 y 999. Por el contrario, existen categorías que tienen muy poca presencia en los datos, por ejemplo la 12, 14 y 23, estas categorías con poca representación en los datos muy probablemente serán complicadas de modelar. Para tener mayor detalle se obtienen las frecuencias por categoría:

##     3     4     5     6     7     8     9    12    14    15    18    19 
##  3643   346  4593  1277  5752 12161  9464   269     4   978   549   375 
##    20    21    22    23    24    25    26    27    28    29    30    31 
##   637   641   928   139  2609  3698   503   785   492   433  1081   594 
##    32    33    34    35    36    37    38    39    40    41    42    43 
##  1984  1315   719  2030  3005  2788  2912  9896  6130   583  1858   872 
##    44   999 
##  1187  8444

Análisis Univariado

Se realiza ahora el análisis univariado sobre las variables explicativas.

El día de la semana tiene la siguiente distribución:

Notoriamente, la mayoría de las visitas se realizan entre el viernes y el domingo, principalmente el fin de semana. Resulta curioso que el día de la semana con menos visitas es el jueves.

Las visitas realizadas cada día de la semana son las siguientes:

##    Monday   Tuesday Wednesday  Thursday    Friday  Saturday    Sunday 
##     12027     11530     11612     11243     15234     16904     17124

El departmento al cual pertenecen los productos comprados y devueltos tiene la siguiente distribución:

Como era de esperarse, existen departamentos con mucha población y departamentos con escasa población.

Es importante recordar que la estructura de la base transformada tiene una columna por cada departamento, por lo tanto la distribución real de cada variable de departamento tiene distribuciones muy concentradas en el cero, por ejemplo:

Incluso en el departamento más pobaldo GROCERY DRY GOODS, la distribución está bastante concentrada en el cero:

Agregar todas las gráficas como anexo

Análisis Bivariado

Resulta complicado visualizar las gráficas de la variable objetivo con las variables explicativas, pues el tipo de visita puede tomar 38 valores diferentes. Por ello, se realizarán gráficas separadas, mostrando de 10 en 10 las categorías.

La distribución del día de la semana en que se realiza la visita, para cada categoría se muestra a continuación:

Teniendo en mente la gráfica univariada del día de la semana que se mostró en la sección anterior, y contrastando con la distribución de esta variable para cada categoría, se pueden sacar patrones de cada uno de los tipos de visita. Mencionaremos algunos de ellos:

En la categoría 3, la distribución del día de la semana es bastante diferente a la global, pues tienen un nivel bajo el lunes, comienza a subir, disimuye el jueves y llega a su máximo en viernes, descendiendo el fin de semana.

En la categoría 25, las visitas a Walmart tienen su menor número en lunes, y van a aumentando día a día llegando a su máximo el domingo.

Para la categoría 40, el patrón es igual al global, pero las diferencias del nivel en los diferentes días es más acentuada que en la distribución global.

Es importante mencionar, que todos los tipos de vísita tienen su máximo entre el viernes y el domingo.

Respecto a la variable objetivo y los distintos departamentos, nuevamente se separa en 4 gráficas y se acotó el rango del eje x de -1 a 10 para facilitar su entendimiento e interpretación.

La gráfica bivariada de la variable objetivo y el departamento con mayores compras GROCERY DRY GOODS se muestra a continuación:

Se observa que en la mayoría de las categorías, el departamento GROCERY DRY GOODS está concenctrado en el cero, pero existen categorías con distribuciones que muestran concentraciones en valores positivos. Por ejemplo 12, 15, 44 y más notoriamente en las categorías 37, 38, 39 y 40. Se puede pensar que estas categorías pueden referirse a visitas a Walmart orientadas a compras de este tipo de productos.

Ahora se analiza la distribución del departamento DSD GROCERY para cada tipo de categoría:

Este departamento resulta ser más interesante, pues tiene muchas menos categorías concentradas en el cero. Por ejemplo, la categoría 35 parece tener muy poca población en el cero a diferencia del departamento que se mostró anteriormente.

Ahora se realiza el análisis sobre un departamento menos poblado que los anteriores, éste es PHARMACY OTC:

En este departamento, llaman mucho la atención las categorías 4 y 5 pues son las que tienen una distribución más alejada del cero. Esto lleva a pensar que estas categorías están ligadas con la compra de productos farmacéuticos.

El análisis se vuelve más complicado cuando los departamentos están poco poblados, por ejemplo en JEWELRY AND SUNGLASSES, las gráficas son las siguientes:

En este departamento se redujo más el rango del eje x, de -1 a 5 para tener mejor visualización. La distribución de joyería y lentes de sol tiene una altísima concentración en el cero para prácticamente todas las categorías.

Análisis Multivariado

Gráficas

Preparar base para procesar en Python

Finalmente, se guardan los datos como un archivo feather para poder realizar el ajuste de modelos en Python.

path <- "Datos/walmart.feather"
write_feather(walmartSpread, path)